//! 生成 Vec<&T> 的打乱序列

use super::random_list;

/// 生成 Vec<&T> 的打乱序列
pub trait ReferShuffle<T> {
    /// 生成 Vec<&T> 的打乱序列
    ///
    /// 不消耗原始数据，只获取引用
    fn shuffle_ref(&self) -> Vec<&T>;
}

impl<T> ReferShuffle<T> for Vec<T> {
    fn shuffle_ref(&self) -> Vec<&T> {
        let vec_len = self.len();
        let mut res = Vec::with_capacity(vec_len);
        random_list(0, vec_len).into_iter().for_each(|rand_index| {
            if let Some(value) = self.get(rand_index) {
                res.push(value);
            }
        });

        res
    }
}

#[cfg(test)]
mod test {

    use super::*;

    #[test]
    fn test_shuffle_ref() {
        let list = vec![1, 2, 3, 4, 5];

        let rand_ref = list.shuffle_ref();

        println!("{:?}", rand_ref);
    }
}
